#pragma once
#include <sys/types.h>
/**
 * 
 * @berief vds对象。虚拟目录系统对象。
 *
 */
typedef struct vds_s vds_t;

/**
 *
 * @brief 根据传入的根路径，初始化vds对象。
 *
 * 根据传入的根路径，初始化vds对象。
 *
 * @param[in] root 初始化的vds的根路径。
 *
 * @return 一个vds对象。
 *
 * @retval NULL 初始化失败
 * @retval !NULL 初始化成功
 */
vds_t* vds_init(const char *root);

/**
 * 
 * @brief 切换vds的当前目录。
 *
 * 切换vds的当前目录到指定的目录路径。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] path 需要切换的目录路径。
 *
 * @return 返回执行结果。
 *
 * @note 返回值非0时，可以调用vds_error打印报错信息。
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_cd(vds_t *vds,const char *path);

/**
 *
 * @brief 获取vds的当前目录。
 *
 * 获取vds的当前目录路径。结果存储在path中，path为NULL时，将在申请PATH_MAX大小的内存存储结果，需要在后续调用free手动释放。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[out] path 存储vds当前的工作目录。
 *
 * @return 返回vds当前的工作目录。
 *
 * @note 返回值为NULL时，可以调用vds_error打印报错信息。
 * @retval !NULL 成功
 * @retval NULL 失败
 */
char *vds_pwd(vds_t *vds,char *path);

/**
 *
 * @brief 获取vds的当前目录下的信息。
 *
 * 获取vds的当前目录下的信息。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] ls的路径
 * @param[out] output 存储vds当前目录下的信息。
 * @param[in] output_size 输出数组的上限。
 *
 * @return 返回执行结果。
 *
 * @note 返回值非0时，可以调用vds_error打印报错信息。
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_ls(vds_t *vds,const char *path,char *output,size_t output_size);

/**
 *
 * @brief 删除指定文件。
 *
 * 删除指定的文件。可以传入一个单独的文件名，表示当前目录下的文件，也可以传入相对路径和绝对路径的文件名。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] file_name 需要删除的文件名。
 *
 * @return 返回执行结果。
 *
 * @note 返回值非0时，可以调用vds_error打印报错信息。
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_remove(vds_t *vds,const char *file_name);

/**
 *
 * @brief 创建一个文件夹。
 *
 * 在vds当前目录下创建一个文件夹。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] dir_name 被创建的文件夹名称。
 *
 * @return 返回执行结果。
 *
 * @note 返回值非0时，可以调用vds_error打印报错信息。
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_mkdir(vds_t *vds,const char *dir_name);

/**
 *
 * @brief 删除一个文件夹。
 *
 * 删除vds当前目录下的一个文件夹。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] dir_name 被删除的文件夹名称。
 *
 * @return 返回执行结果。
 *
 * @note 返回值非0时，可以调用vds_error打印报错信息。
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_rmdir(vds_t *vds,const char *dir_name);

/**
 *
 * @brief 获取vds执行的报错信息。
 *
 * 根据vds当前的执行状态，获取相应的报错信息。
 *
 * @param[in] vds 一个vds对象。
 *
 * @return 返回执行结果。
 *
 * @retval !NULL 成功
 * @retval NULL 失败
 */
const char *vds_error(const vds_t *vds);

/**
 *
 * @brief 根据path获取vds真实的目录路径。
 *
 * 根据传入的path解析成真实路径。
 *
 * @param[in,out] vds 一个vds对象。
 * @param[in] path 被解析的路径。
 * @param[out] resolved_path 存储解析的路径结果。
 *
 * @return 返回解析的结果。
 *
 * @note 返回值NULL时，可以调用vds_error打印报错信息。
 * @retval !NULL 成功
 * @retval NULL 失败
 */
char *vds_real_path(vds_t *vds,const char *path,char *resolved_path);

/**
 * 
 * @brief 释放vds对象的内存空间。
 *
 * 释放vds对象占用的内存空间。
 *
 * @param[in] vds 一个vds对象。
 *
 * @return 返回执行结果。
 *
 * @retval 0 成功
 * @retval -1 失败
 */
int vds_free(vds_t *vds);

